home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 9 / Night Owl CD-ROM (NOPV9) (Night Owl Publisher) (1993).ISO / 009a / snpd0493.zip / VIDEO.C < prev    next >
C/C++ Source or Header  |  1993-04-05  |  6KB  |  182 lines

  1. /*------------------------------[ vhdw.c ]-----------------------------*/
  2. /*                     Hardware Interface Routines                     */
  3. /*---------------------------------------------------------------------
  4.  
  5. /*---------------------------------------------------------------------*/
  6. /* This code is a subset of a library copyrighted by Jeff Dunlop.      */
  7. /* License is hereby granted for unrestricted use.                     */
  8. /*---------------------------------------------------------------------*/
  9.  
  10. /*---------------------------------------------------------------------*/
  11. /* dv_info: get video and version info about DesqView                  */
  12. /* get_rows: determine number of rows on screen                        */
  13. /* get_cols: determine number of columns on screen                     */
  14. /* get_vidpage: determine the current text mode video page             */
  15. /* get_vidbase: determine the base of video ram                        */
  16. /* is_dv: determine if DesqView is loaded                              */
  17. /* is_egavga: determine if monitor is ega/vga                          */
  18. /*---------------------------------------------------------------------*/
  19.  
  20. /*--------------------------------------------------------------*/
  21. /*-----------------------[ include files ]----------------------*/
  22. /*--------------------------------------------------------------*/
  23.  
  24. #include <dos.h>
  25.  
  26. #ifndef MK_FP
  27.  #define MK_FP(seg,offset) \
  28.         ((void _far *)(((unsigned long)(seg)<<16) | (unsigned)(offset)))
  29. #endif
  30.  
  31. typedef struct
  32. {
  33.     int ver_major;
  34.     int ver_minor;
  35.     unsigned regen_buf;
  36.     int win_rows;
  37.     int win_cols;
  38. } DV_INFO;
  39.  
  40. /*------------------------[ get_vidpage ]-----------------------*/
  41. /* Determine the current text mode video page                   */
  42. /*--------------------------------------------------------------*/
  43. /* local:                                                       */
  44. /*      regs = register storage buffer                          */
  45. /* return:                                                      */
  46. /*      video page number as determined by bios call            */
  47. /*--------------------------------------------------------------*/
  48.  
  49. unsigned char get_vidpage(void)
  50. {
  51.     union REGS regs;
  52.  
  53.     regs.h.ah = 0x0f;
  54.     int86(0x10, ®s, ®s);
  55.     return regs.h.bh;
  56. }
  57.  
  58. /*---------------------------[ is_dv ]--------------------------*/
  59. /*             Determine whether DesqView is active             */
  60. /*--------------------------------------------------------------*/
  61.  
  62. int is_dv(void)
  63. {
  64.     union REGS regs;
  65.  
  66.     regs.h.ah = 0x2b;
  67.     regs.x.cx = 0x4445;         /* 'DE' */
  68.     regs.x.dx = 0x5351;         /* 'SQ' */
  69.     regs.h.al = 1;              /* get version */
  70.     int86(0x21, ®s, ®s);
  71.  
  72.     return regs.h.al != 0xff;
  73. }
  74.  
  75. /*--------------------------[ dv_info ]-------------------------*/
  76. /*      Return screen and version info about DesqView           */
  77. /*--------------------------------------------------------------*/
  78. /* return:                                                      */
  79. /*      -1 on error                                             */
  80. /*--------------------------------------------------------------*/
  81.  
  82. int get_dvinfo(DV_INFO *dv_info)
  83. {
  84.     union REGS regs;
  85.  
  86.     regs.h.ah = 0x2b;
  87.     regs.x.cx = 0x4445;         /* 'DE' */
  88.     regs.x.dx = 0x5351;         /* 'SQ' */
  89.     regs.h.al = 1;              /* get version */
  90.     int86(0x21, ®s, ®s);
  91.  
  92.     if (regs.h.al == 0xff)
  93.         return -1;
  94.     dv_info->ver_major = regs.h.bh;
  95.     dv_info->ver_minor = regs.h.bl;
  96.     regs.h.al = 4;              /* get screen info */
  97.     int86(0x21, ®s, ®s);
  98.  
  99.     if (regs.h.al == 0xff)
  100.         return -1;
  101.     dv_info->regen_buf = regs.x.dx;
  102.     dv_info->win_rows = regs.h.bh;
  103.     dv_info->win_cols = regs.h.bl;
  104.     return 0;
  105. }
  106.  
  107. /*------------------------[ get_vidbase ]-----------------------*/
  108. /* Determine the base of video ram                              */
  109. /*--------------------------------------------------------------*/
  110. /* local:                                                       */
  111. /*      regs = register union for ISR                           */
  112. /* return:                                                      */
  113. /*      the current text base segment                           */
  114. /*--------------------------------------------------------------*/
  115.  
  116. unsigned get_vidbase(void)
  117. {
  118.     union REGS regs;
  119.     DV_INFO dv_info;
  120.  
  121.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  122.         return dv_info.regen_buf;
  123.     else
  124.     {
  125.         regs.h.ah = 0xf;
  126.         int86(0x10, ®s, ®s);
  127.  
  128.         if (regs.h.al == 7)
  129.             return 0xb000;
  130.         else
  131.             return 0xb800;
  132.     }
  133. }
  134.  
  135. /*-------------------------[ get_rows ]-------------------------*/
  136. /*  Determine the number of rows in current text mode screen    */
  137. /*--------------------------------------------------------------*/
  138.  
  139. int is_egavga(void);
  140.  
  141. int get_rows(void)
  142. {
  143.     DV_INFO dv_info;
  144.     char far *p = MK_FP(0x40, 0x84);
  145.  
  146.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  147.         return dv_info.win_rows;
  148.     else
  149.         return *p + is_egavga();
  150. }
  151.  
  152. /*-------------------------[ get_cols ]-------------------------*/
  153. /*  Determine the number of columns in current text screen      */
  154. /*--------------------------------------------------------------*/
  155.  
  156. int get_cols(void)
  157. {
  158.     DV_INFO dv_info;
  159.     int far *p = MK_FP(0x40, 0x4a);
  160.  
  161.     if (is_dv() && get_dvinfo(&dv_info) != -1)
  162.         return dv_info.win_cols;
  163.     else
  164.         return *p;
  165. }
  166.  
  167. /*-------------------------[ is_egavga ]------------------------*/
  168. /*      Determine whether the current text mode is ega/vga      */
  169. /*--------------------------------------------------------------*/
  170.  
  171. int is_egavga(void)
  172. {
  173.     union REGS regs;
  174.  
  175.     regs.h.ah = 0x1a;
  176.     regs.h.al = 0;
  177.  
  178.     int86(0x10, ®s, ®s);
  179.  
  180.     return regs.h.al == 0x1a;
  181. }
  182.